#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

char board[15][15];
char key_x = 7 , key_y = 7;
char role = '@';

void init_board(void);
void show_board(void);
void get_key(void);
bool check_key(void);

int main()
{
	init_board();
	for(int i = 0; i < 255; i++)
	{
		show_board();
		get_key();
		if(check_key())
		{
			show_board();
			printf("恭喜%c方获胜！\n",role);
			return 0;  // 如果用break则会直接执行打印平局的语句
		}
		role = role == '@'?'#':'@';
	}
	printf("平局结果，握手言和！\n");
}

// 初始化棋盘
void init_board(void)
{	
	for(int x = 0; x < 15; x++)
	{
		for(int y = 0; y < 15; y++)
		{
			board[x][y] = '*';
		}
	}
}

// 显示棋盘
void show_board(void)
{
	// 清屏
	system("clear");
	
	// 显示棋盘数组
	for(int x = 0; x < 15; x++)
	{
		for(int y = 0; y < 15; y++)
		{
			printf(" %c",board[x][y]);
		}
		printf("\n");
	}
}

// 接收棋子坐标
void get_key(void)
{
	printf("请");
	while(true)  // 不落子不运行
	{
		printf("输入棋子(x,y)："); 
		scanf("%hhd%hhd",&key_x,&key_y);
		if(key_x > 14 || key_x < 0 || key_y > 14 || key_y < 0)
		{
			printf("输入有误，请重新输入！\n");
			continue;
		}
		if('*' != board[key_x][key_y]) 
		{
			printf("此位置已有棋子，请重新输入！\n");
			continue;
		}
		board[key_x][key_y] = role;
		return;
	}
}

// 判断五子连珠
bool check_key(void)
{
	int count1 = 0 , count2 = 0 , count3 = 0 , count4 = 0;
	// 检查四个方向，有返回真，无返回
	// 竖
	for(int x = key_x - 1 , y = key_y; x >= 0; x--)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count1++;
		}
		else
		{
			break;
		}
	}
	for(int x = key_x + 1 , y = key_y; x < 15; x++)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count1++;
		}
		else
		{
			break;
		}
	}

	// 横
	for(int x = key_x , y = key_y - 1; y >= 0; y--)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count2++;
		}
		else
		{
			break;
		}
	}
	for(int x = key_x , y = key_y + 1; y < 15; y++)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count2++;
		}
		else
		{
			break;
		}
	}

	// 左下
	for(int x = key_x - 1 , y = key_y - 1; x >= 0 && y >= 0; x--, y--)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count3++;
		}
		else
		{
			break;
		}
	}
	for(int x = key_x + 1 , y = key_y + 1; x < 15 && y < 15; x++, y++)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count3++;
		}
		else
		{
			break;
		}
	}
	
	// 右下
	for(int x = key_x - 1 , y = key_y + 1; x >= 0 && y < 15; x--, y++)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count4++;
		}
		else
		{
			break;
		}
	}
	for(int x = key_x + 1 , y = key_y - 1; x < 15 && y >= 0; x++, y--)
	{
		if(board[x][y] == board[key_x][key_y])
		{
			count4++;
		}
		else
		{
			break;
		}
	}
	
	
	if(count1 >= 4)
	{
		return true;
	}
	else if(count2 >= 4)
	{
		return true;
	}
	else if(count3 >= 4)
	{
		return true;
	}
	else if(count4 >= 4)
	{
		return true;
	}
	return false;
}
